libobs_wrapper\display\window_manager/
show_hide.rs1#[cfg(windows)]
2use std::sync::atomic::Ordering;
3#[cfg(windows)]
4use windows::Win32::UI::WindowsAndMessaging::{ShowWindow, SW_HIDE, SW_SHOWNA};
5
6use crate::display::window_manager::ShowHideTrait;
7use crate::display::ObsDisplayRef;
8use crate::run_with_obs;
9use crate::utils::ObsError;
10
11impl ShowHideTrait for ObsDisplayRef {
12 fn show(&mut self) -> Result<(), ObsError> {
17 log::trace!("show");
18
19 #[cfg(windows)]
20 if let Some(m) = &self.child_window_handler {
21 let m = m
22 .read()
23 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
24 unsafe {
25 let _ = ShowWindow(m.window_handle.get_hwnd(), SW_SHOWNA);
26 }
27
28 m.is_hidden.store(false, Ordering::Relaxed);
29 return Ok(());
30 }
31
32 let ptr = self.display.clone();
33 run_with_obs!(self.runtime, (ptr), move || unsafe {
34 libobs::obs_display_set_enabled(ptr, true);
35 })?;
36 Ok(())
37 }
38
39 fn hide(&mut self) -> Result<(), ObsError> {
40 log::trace!("hide");
41 #[cfg(windows)]
42 if let Some(m) = &self.child_window_handler {
43 let m = m
44 .read()
45 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
46
47 unsafe {
48 let _ = ShowWindow(m.window_handle.get_hwnd(), SW_HIDE);
49 }
50
51 m.is_hidden.store(true, Ordering::Relaxed);
52 return Ok(());
53 }
54
55 let ptr = self.display.clone();
56 run_with_obs!(self.runtime, (ptr), move || unsafe {
57 libobs::obs_display_set_enabled(ptr, false);
58 })?;
59 Ok(())
60 }
61
62 fn is_visible(&self) -> Result<bool, ObsError> {
63 #[cfg(windows)]
64 if let Some(m) = &self.child_window_handler {
65 let m = m
66 .read()
67 .map_err(|e| ObsError::LockError(format!("{:?}", e)))?;
68
69 return Ok(!m.is_hidden.load(Ordering::Relaxed));
70 }
71
72 let ptr = self.display.clone();
73 run_with_obs!(self.runtime, (ptr), move || unsafe {
74 let enabled = libobs::obs_display_enabled(ptr);
75 Ok(enabled)
76 })?
77 }
78}